package com.example.zz.example.pattern.composite;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.example.zz.example.R;

/**
 * 组合模式：将对象组成树型结构以表示“部分-整体”的层次结构。这种模式使得用户对单个对象和组合对象的使用具有一致性，即客户程序可以像处理简单元素一样来处理复杂元素
 *
 * 组合模式的主要特点：
 * 1、定义了包含基本对象和组合对象的类层次结构
 * 2、基本对象可以被组合成更复杂的组合对象，而组合对象又可以包含其他组合对象或基本对象
 *
 * 理解：例如，在一个文件系统中，客户端可以统一地对文件和文件夹进行操作，无需关心它们的具体类型
 *
 * 优点：
 * 1、简化了客户端的代码，客户端不需要区分处理的是单个对象还是组合对象，可以对它们进行一致的处理
 * 2、更容易扩展，新增对象类型不会影响现有代码
 *
 * 应用场景：
 * 1、ViewGroup和View,就是组合模式的应用，view表示单独的控件，ViewGroup表示一组控件；当我们对视图进行测量、布局和绘制时，系统会以统一的方式对View和ViewGroup进行处理，如调用measure()方法，不管是view还是ViewGroup都会逐层进行测量，不需要关心子节点不会执行到
 * 2、文件系统，文件和文件夹都是文件系统的节点，文件夹可以包含文件和文件夹，文件夹可以递归地包含文件和文件夹
 * 3、OA系统中，部门和员工的关系，部门可以包含员工和部门，员工可以递归地包含员工和部门
 *
 */
public class CompositeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_composite);

        Composite root = new Composite();
        Leaf leaf_a = new Leaf("Leaf A");
        Leaf leaf_b = new Leaf("Leaf B");

        Composite composite = new Composite();
        Leaf leaf_c = new Leaf("Leaf C");
        composite.add(leaf_c);

        root.add(leaf_a);
        root.add(leaf_b);
        root.add(composite);

        root.operation();
    }
}